package initialize

import (
	"fmt"
	"init-database/global"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

// GormMysql 初始化MySQL数据库连接
func GormMysql() *gorm.DB {
	dsn, err := Dsn()
	if err != nil {
		return nil
	}

	if db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)}); err != nil {
		fmt.Printf("数据库连接失败：%v", err)
		return nil
	} else {
		// 获取底层SQL DB对象以配置连接池
		sqlDB, err := db.DB()
		if err != nil {
			fmt.Printf("获取连接池失败: %v", err)
			return nil
		}
		// 连接池配置（根据项目需求调整）
		sqlDB.SetMaxIdleConns(10)           // 空闲连接数
		sqlDB.SetMaxOpenConns(100)          // 最大连接数
		sqlDB.SetConnMaxLifetime(time.Hour) // 连接最大存活时间

		fmt.Println("数据库初始化成功！")
		return db
	}

}

// Dsn 生成DSN
func Dsn() (dsn string, err error) {
	// 从Viper读取配置（确保config.yaml键名匹配）
	config := struct {
		Host     string `mapstructure:"host"`
		Port     int    `mapstructure:"port"`
		Username string `mapstructure:"username"`
		Password string `mapstructure:"password"`
		DBName   string `mapstructure:"db-name"`
	}{}
	// 从Viper读取配置
	if err = global.GLOBAL_VP.UnmarshalKey("mysql", &config); err != nil {
		return dsn, err
	}

	// 生成DSN
	dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		config.Username,
		config.Password,
		config.Host,
		config.Port,
		config.DBName,
	)
	return dsn, nil
}
